package LeetCode;

import java.util.HashMap;
import java.util.Map;

//单词规律
//给定一种规律 pattern和一个字符串str，判断 str 是否遵循相同的规律。
//这里的遵循指完全匹配，例如，pattern里的每个字母和字符串str中的每个非空单词之间存在着双向连接的对应规律。
//示例1:
//输入: pattern = "abba", str = "dog cat cat dog"
//输出: true
//示例 2:
//输入:pattern = "abba", str = "dog cat cat fish"
//输出: false
public class Num290 {
    public static boolean wordPattern(String pattern, String str) {
        //Map集合方法
        Map<String,Character> s = new HashMap<>();
        Map<Character,String> ch = new HashMap<>();
        int len = str.length();
        //k用来记录在字符串str中走到的位置
        int k = 0;
        for (int i = 0; i < pattern.length(); i++) {
            char c = pattern.charAt(i);
            if (k > len) {
                return false;
            }
            int j = k;
            //先确定str的第一个单词
            while (j < len && str.charAt(j) != ' ') {
                j++;
            }
            String temp = str.substring(k,j);
            k = j + 1;
            if (s.containsKey(temp) && s.get(temp) != c) {
                //此时s集合中有key为temp的键值对，且value ！= c
                return false;
            }
            if (ch.containsKey(c) && !temp.equals(ch.get(c))) {
                //理由同上
                return false;
            }
            s.put(temp,c);
            ch.put(c,temp);
        }
        //最后在判断str是否走完
        return k >= len;
        //数组方法
//        String[] pa = pattern.split("");
//        //先利用分割将字符串分割成字符串数组
//        String[] str = s.split(" ");
//        //如果长度一样进入下一步比较
//        if (pa.length == str.length) {
//            //定义两个int型数组用来记录两个字符串数组数据，长度一样
//            int[] arr1 = new int[str.length];
//            int[] arr2 = new int[str.length];
//            //定义一个，用来比较的信息值
//            int num = 0;
//            for (int i = 0; i < pa.length; i++) {
//                for (int j = 0; j < str.length; j++) {
//                    //如果字符串数组中有相等的，则相应在整型数组中赋予相同的值
//                    if (pa[i].equals(pa[j])) {
//                        arr1[j] = num;
//                    }
//                    if (str[i].equals(str[j])) {
//                        arr2[j] = num;
//                    }
//                    //边循环边比较，如果当前两个数组中相同位置的信号值不同，则直接返回false
//                    if (arr1[i]!=arr2[i]){
//                        return false;
//                    }
//                    //存储值变换，进入下一循环
//                    num++;
//                }
//            }
//            //如果循环执行完成，则说明，一一对应
//            return true;
//        } else {
//            //反之长度不一样，直接返回false
//            return false;
//        }
    }

    public static void main(String[] args) {
        System.out.println(wordPattern("abba","dog cat cat dog"));
    }
}
